package qc.module.ehs.api.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.*;
import qc.common.core.constants.QCAuthConstant;
import qc.common.core.exception.QCPromptException;
import qc.module.ehs.dto.taskexecute.*;
import qc.module.ehs.service.EhsTaskExecService;
import qc.module.platform.dto.uac.UacUserInfoDto;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * EHS 任务执行记录Controller
 *
 * @author QuCheng Tech
 * @since 2024/11/13
 */
@RestController
@RequestMapping("/taskexec")
public class TaskExecuteController {

    @Autowired
    private EhsTaskExecService service;

    @Autowired
    HttpServletRequest request;

    @Autowired
    private RestTemplatePlatform restTemplatePlatform;
    
    /**
     * 获取指定任务项的所有执行记录
     * 返回的结果按照执行起始时间降序排列；
     *
     * @param id 任务项ID
     * @return List<TaskExecuteInfoDto>
     * @author QuCheng Tech
     * @since 2024/11/13
     */
    @GetMapping("/item")
    public List<TaskExecuteInfoDto> getTaskItemExecutesByParam(@RequestParam String id){
        return service.getTaskItemExecutes(id);
    }

    /**
     * 获取指定任务项的所有执行记录
     * 返回的结果按照执行起始时间降序排列；
     *
     * @param id 任务项ID
     * @return List<TaskExecuteInfoDto>
     * @author QuCheng Tech
     * @since 2024/11/13
     */
    @GetMapping("/item/{id}")
    public List<TaskExecuteInfoDto> getTaskItemExecutesByPath(@PathVariable String id){
        return service.getTaskItemExecutes(id);
    }

    /**
     * 获取指定任务分组的所有执行记录
     * 
     * 一个任务分组表示一个单元的任务集合，一个任务项表示一个单元一个执行周期（如一个月）的执行记录；
     * 需要将单元的所有执行记录进行展示时，需要根据任务分组进行查询；
     * 返回的结果按照执行起始时间降序排列；
     * 
     * @param id 任务分组ID
     * @return List<TaskExecuteInfoDto>
     * @author QuCheng Tech
     * @since 2024/11/13
     */
    @GetMapping("/group")
    public List<TaskExecuteInfoDto> getTaskGroupExecutesByParam(@RequestParam String id){
        return service.getTaskGroupExecutes(id);
    }

    /**
     * 获取指定任务分组的所有执行记录
     *
     * 一个任务分组表示一个单元的任务集合，一个任务项表示一个单元一个执行周期（如一个月）的执行记录；
     * 需要将单元的所有执行记录进行展示时，需要根据任务分组进行查询；
     * 返回的结果按照执行起始时间降序排列；
     *
     * @param id 任务分组ID
     * @return List<TaskExecuteInfoDto>
     * @author QuCheng Tech
     * @since 2024/11/13
     */
    @GetMapping("/group/{id}")
    public List<TaskExecuteInfoDto> getTaskGroupExecutesByPath(@PathVariable String id){
        return service.getTaskItemExecutes(id);
    }

    /**
     * 获取指定执行记录
     * 
     * @param id 执行记录ID
     * @return TaskExecuteInfoDto
     * @author QuCheng Tech
     * @since 2024/11/13
     */
    @GetMapping("/get")
    public TaskExecuteInfoDto getByParam(@RequestParam String id){
        return service.get(id);
    }

    /**
     * 获取指定执行记录
     *
     * @param id 执行记录ID
     * @return TaskExecuteInfoDto
     * @author QuCheng Tech
     * @since 2024/11/13
     */
    @GetMapping("/get/{id}")
    public TaskExecuteInfoDto getByPath(@PathVariable String id){
        return service.get(id);
    }

    /**
     * 新增执行记录
     * 
     * 要求任务项执行完成为false并且终止/取消为false；
     * 需要根据任务中是否需要确认对写入记录的是否确认状态进行设置；
     * 如不需要确认同时是否执行完成为true时，表示任务项已执行完成，在添加执行记录后自动设置对应任务项的执行完成为true；
     *      同时对实际执行次数、完成时间、辨识危险源次数、上报隐患次数、最新执行起止时间进行更新；
     * 
     * @param dto 新增DTO
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/19
     */
    @RequestMapping(value = "/add",method = {RequestMethod.POST})
    public String add(@RequestBody TaskExecuteAddDto dto) throws QCPromptException {
        HttpHeaders headers = new HttpHeaders();
        headers.add(QCAuthConstant.TOKEN_HEADER_KEY, request.getHeader(QCAuthConstant.TOKEN_HEADER_KEY));
        headers.add(QCAuthConstant.PROJECT_CODE_HEADER_KEY, request.getHeader(QCAuthConstant.PROJECT_CODE_HEADER_KEY));
        //根据token获取用户信息
        UacUserInfoDto userInfo = restTemplatePlatform.getUserInfo(headers);

        return service.add(dto, userInfo);
    }

    /**
     * 修改执行记录
     * 
     * 要求任务项执行完成为false并且终止/取消为false；
     * 需要根据任务中是否需要确认对写入记录的是否确认状态进行设置；
     * 如不需要确认同时是否执行完成为true时，表示任务项已执行完成，在修改执行记录后自动设置对应任务项的执行完成为true；
     *      同时对实际执行次数、完成时间、辨识危险源次数、上报隐患次数、最新执行起止时间进行更新；
     * 
     * @param dto 修改DTO
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/19
     */
    @RequestMapping(value = "/update",method = {RequestMethod.POST,RequestMethod.PUT})
    public String update(@RequestBody TaskExecuteUpdateDto dto) throws QCPromptException {
        HttpHeaders headers = new HttpHeaders();
        headers.add(QCAuthConstant.TOKEN_HEADER_KEY, request.getHeader(QCAuthConstant.TOKEN_HEADER_KEY));
        headers.add(QCAuthConstant.PROJECT_CODE_HEADER_KEY, request.getHeader(QCAuthConstant.PROJECT_CODE_HEADER_KEY));
        //根据token获取用户信息
        UacUserInfoDto userInfo = restTemplatePlatform.getUserInfo(headers);

        return service.update(dto, userInfo);
    }

    /**
     * 删除执行记录
     * 
     * 要求任务项执行完成为false并且终止/取消为false，同时执行记录的是否通过确认为false或确认时间为空（任务中设置不需要确认）；
     * 
     * @param id 执行记录ID
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/19
     */
    @DeleteMapping("/delete")
    public String deleteByParam(@RequestParam String id){
        return service.delete(id);
    }

    /**
     * 删除执行记录
     *
     * 要求任务项执行完成为false并且终止/取消为false，同时执行记录的是否通过确认为false或确认时间为空（任务中设置不需要确认）；
     *
     * @param id 执行记录ID
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/19
     */
    @DeleteMapping("/delete/{id}")
    public String deleteByPath(@PathVariable String id){
        return service.delete(id);
    }

    /**
     * 确认执行记录
     * 
     * 要求执行记录的是否确认为false；
     * 在确认操作后如执行记录中的执行是否完成为true，自动设置任务项的执行完成为true；同时对实际执行次数、完成时间、辨识危险源次数、上报隐患次数、最新执行起止时间进行更新；
     * 
     * @param dto 确认信息
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/11/19
     */
    @RequestMapping(value = "/confirm",method = {RequestMethod.POST})
    public String confirm(@RequestBody TaskExecuteConfirmDto dto) throws QCPromptException {
        HttpHeaders headers = new HttpHeaders();
        headers.add(QCAuthConstant.TOKEN_HEADER_KEY, request.getHeader(QCAuthConstant.TOKEN_HEADER_KEY));
        headers.add(QCAuthConstant.PROJECT_CODE_HEADER_KEY, request.getHeader(QCAuthConstant.PROJECT_CODE_HEADER_KEY));
        //根据token获取用户信息
        UacUserInfoDto userInfo = restTemplatePlatform.getUserInfo(headers);

        return service.confirm(dto, userInfo);
    }

    /**
     * 查询执行记录
     * 
     * 用于查询指定单元或指定危险源的任务执行记录；返回的数据按执行开始时间升序排列；
     * 
     * @param condition 查询条件
     * @return List<TaskExecuteInfoDto>
     * @author QuCheng Tech
     * @since 2024/12/3
     */
    @RequestMapping(value = "/query",method = {RequestMethod.POST})
    public List<TaskExecuteInfoDto> query(@RequestBody TaskExecuteQueryConditionDto condition) throws QCPromptException {
        return service.query(condition);
    }
}
